#include "prescriptionchecker_export.h"
#include "prescriptionchecker.h"
#include <QApplication>
#include <QJsonDocument>
#include <QJsonObject>
#include <QDebug>
#include <cstring>
#include <memory>

// 全局变量，用于确保Qt应用程序存在
static QApplication* g_app = nullptr;
static int g_app_ref_count = 0;
static PrescriptionChecker* g_checker = nullptr;

// 初始化函数
static bool initialize() {
    try {
        // 确保Qt应用程序存在
        if (!QApplication::instance()) {
            int argc = 0;
            char** argv = nullptr;
            g_app = new QApplication(argc, argv);
            g_app_ref_count = 1;
        } else {
            g_app_ref_count++;
        }
        
        // 创建全局检查器实例
        if (!g_checker) {
            g_checker = new PrescriptionChecker();
        }
        
        return true;
    } catch (const std::exception& e) {
        qDebug() << "初始化失败:" << e.what();
        return false;
    }
}

// 清理函数
static void cleanup() {
    if (g_checker) {
        delete g_checker;
        g_checker = nullptr;
    }
    
    // 清理Qt应用程序
    g_app_ref_count--;
    if (g_app_ref_count <= 0 && g_app) {
        delete g_app;
        g_app = nullptr;
    }
}

extern "C" {

PRESCRIPTIONCHECKER_EXPORT int DoctorCheck(const char* xmlData, DataCallback dataCallback) {
    if (!xmlData || !dataCallback) {
        return -1;
    }
    
    // 初始化（如果尚未初始化）
    if (!initialize()) {
        return -1;
    }
    
    if (!g_checker) {
        return -1;
    }
    
    try {
        QString xml = QString::fromUtf8(xmlData);
        
        auto cppDataCallback = [dataCallback](const char* data) {
            dataCallback(data);
        };
        
        g_checker->DoctorCheck(1, xml, cppDataCallback);
        return 0;
        
    } catch (const std::exception& e) {
        qDebug() << "开始处方检查失败:" << e.what();
        return -1;
    }
}

} // extern "C"
